package com.demo.java.OD601_650.OD632;

import java.util.*;
import java.util.stream.Collectors;

/**
 * @author bug菌
 * @Source 公众号：猿圈奇妙屋
 * @des： 【二进制差异数(A卷-100分)】问题
 * @url： https://blog.csdn.net/weixin_43970743/article/details/146962350
 */
public class OdMain {
    public static void main(String[] args) {
        // 处理输入
        Scanner in = new Scanner(System.in);
        int n = Integer.parseInt(in.nextLine());  // 读取整数的个数
        // 读取并转化为整数列表
        List<Integer> nums = Arrays.stream(in.nextLine().split(" "))
                .map(Integer::parseInt)  // 将输入的字符串分割并转换为整数
                .collect(Collectors.toList());  // 收集为列表

        // 用于存储每个二进制长度出现的次数
        int[] bit_info = new int[100];

        // 遍历所有整数
        for (int num : nums) {
            String num_binary = Integer.toBinaryString(num);  // 将整数转换为二进制字符串
            int len = num_binary.length();  // 获取二进制字符串的长度

            // 特殊处理：如果该数是0，其二进制表示为"0"，长度为1
            if ("0".equals(num_binary)) {
                bit_info[0]++;
            } else {
                // 将每个二进制长度统计
                bit_info[num_binary.length()]++;
            }
        }

        // 计算二进制差异数
        int res = 0;
        // 遍历bit_info数组，统计不同二进制长度的组合数
        for (int i = 0; i < bit_info.length; i++) {
            for (int j = i + 1; j < bit_info.length; j++) {
                // 每一对不同长度的二进制数，差异数为二者的组合数（乘积）
                res += bit_info[i] * bit_info[j];
            }
        }

        // 输出结果
        System.out.print(res);
    }
}
